//import javax.naming.Context;
//import javax.naming.NamingEnumeration;
//import javax.naming.NamingException;
//import javax.naming.directory.*;
//import javax.naming.ldap.Control;
//import javax.naming.ldap.InitialLdapContext;
//import javax.naming.ldap.LdapContext;
//import javax.naming.ldap.SortControl;
//import java.io.UnsupportedEncodingException;
//import java.util.Calendar;
//import java.util.Date;
//import java.util.Hashtable;
//
//public class LdapSSLUtil {
//
//    //ldap用户登录的3种方式    //方式1. 域\account    private final static String adminName = "tylincn02\\tylinoap";    //方式2. account@域//    private final static String adminName = "tylinoap@tylincn.com";    //方式3.  cn用户（网上最常见的方式可能会有重名的情况，不适用于用户查找，不推荐）//    private final static String adminName = "cn=tylinoap,OU=ITUSER,DC=tylincn,DC=com";
//    private final static String adminName = "hey@kypro.com";
//    private final static String adminPassword = "Heyi@1112";
//    private final String ldapURL = "ldaps://kypro.com:636";   //注意，必须使用域名加636端口
//    private final String factory = "com.sun.jndi.ldap.LdapCtxFactory";
//    private final String BASEN = "DC=kypro,DC=com";
//    //CN=HeY何毅,OU=研发部,OU=Kayang,DC=kypro,DC=com
//    private LdapContext ctx = null;
//
//    private final Control[] sortConnCtls = new SortControl[1];
//
//    public static void main(String[] args)throws Exception{
//        /**
//         *
//         * dn:CN=HeY何毅,OU=研发部,OU=Kayang
//         * AttributeID:sAMAccountName
//         * AttributeValues:HeY
//         *
//         * */
//        System.setProperty("com.sun.jndi.ldap.object.disableEndpointIdentification","true");
//        LdapSSLUtil ldapUtil = new LdapSSLUtil();
//        ldapUtil.ldap_connect(adminName, adminPassword);
//        String account = "HeY";
//        //重置密码
//        ldapUtil.updateUserPassword(account,"abc123567");
////        ldapUtil.getUserDN(account);
////        ldapUtil.getAccountExpiresToDate(account);
////        ldapUtil.getPwdLastSetTime(account);
////
////        ldapUtil.close_connect();
//
//    }
//
//    /**
//     * 用户认证
//     *
//     * @param userName
//     * @param password
//     */
//    public void ldap_connect(String userName, String password) {
//
//        Hashtable<String, String> env = new Hashtable<String, String>();
//        env.put(Context.SECURITY_AUTHENTICATION, "simple");
//        env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
//        if(ldapURL.toLowerCase().startsWith("ldaps:")){
//            env.put("java.naming.ldap.factory.socket", ADHander.CustomSSLSocketFactory.class.getName());
//            System.out.println("AD : SSL PROTOCOL");
//        }
//        env.put(Context.PROVIDER_URL, ldapURL);
//        env.put(Context.SECURITY_PRINCIPAL, userName);
//        env.put(Context.SECURITY_CREDENTIALS, password);
//
////        Hashtable<String, Object> env = new Hashtable<String, Object>();
////        env.put(Context.INITIAL_CONTEXT_FACTORY, factory);
////        env.put(Context.SECURITY_AUTHENTICATION, "simple");
////        env.put(Context.SECURITY_PRINCIPAL, userName);
////        env.put(Context.SECURITY_CREDENTIALS, password);
////        env.put(Context.PROVIDER_URL, ldapURL);
////        env.put(Context.SECURITY_PROTOCOL, "ssl");
// //       env.put("java.naming.ldap.factory.socket", "org.util.ad.DummySSLSocketFactory");
//
//
//        try {
//
//            // 初始化ldapcontext,方式1
////            ctx = new InitialLdapContext(env, null);
//            //方式2
//            sortConnCtls[0] = new SortControl("sAMAccountName", Control.CRITICAL);
//            ctx = new InitialLdapContext(env, sortConnCtls);
//
//            System.out.println("认证成功");
//        } catch (Exception e) {
//            System.out.println("认证失败");
//            e.printStackTrace();
//        }
//    }
//
//    //关闭连接
//    public void close_connect() {
//        try {
//            if (ctx != null) {
//                ctx.close();
//            }
//        } catch (NamingException e) {
//            e.printStackTrace();
//        }
//    }
//
//    /**
//     * 查找用户信息
//     *
//     * @param cn
//     * @return
//     */
//    public Attributes getUser(String cn) {
//        Attributes attrs = null;
//        SearchControls contro = new SearchControls();
//        contro.setSearchScope(SearchControls.SUBTREE_SCOPE);
//        try {
//            //有的企业员工的dn不是有cn开头的，而是由uid开头的，这个因企业而异
//            //使用cn，若存在重名用户，则返回的是最后一个员工，存在bug
////            NamingEnumeration<SearchResult> en = ctx.search(BASEN, "cn=" + cn, contro);
//            //使用sAMAccountName，避免重名，比如存在四个张伟
//            NamingEnumeration<SearchResult> en = ctx.search(BASEN, "sAMAccountName=" + cn, contro);
//            if (en == null || !en.hasMoreElements()) {
//                System.out.println("未找到该用户：" + cn);
//                return null;
//            }
//            while (en.hasMoreElements()) {
//                Object obj = en.nextElement();
//                if (obj instanceof SearchResult) {
//                    SearchResult si = (SearchResult) obj;
//                    attrs = si.getAttributes();
//                    //attrs是用户的一些相关属性，一些很重要的属性
//                    System.out.println(attrs);
//                }
//            }
//        } catch (NamingException e) {
//            System.out.println("查找用户异常。。。");
//            e.printStackTrace();
//        }
//        return attrs;
//    }
//
//    /**
//     * 获取用户的dn
//     *
//     * @param cn
//     * @return
//     */
//    public String getUserDN(String cn) {
//        Attributes attrs = getUser(cn);
//        //distinguishedname这个属性即是用户的dn,可以打印看看
//        String userDN = attrs.get("distinguishedname").toString().split(":")[1].trim();
//        return userDN;
//    }
//
//    //解锁账号和下次登录需要修改密码
//    public void enableUser(String userName) {
//        String userDN = getUserDN(userName);
//        BasicAttributes attrsbu = new BasicAttributes();
//
//        //这个是重点，下面有话有说
//        attrsbu.put("userAccountControl", "512");
//        attrsbu.put("pwdLastSet", "0");
//
//        try {
//            ctx.modifyAttributes(userDN, DirContext.REPLACE_ATTRIBUTE, attrsbu);
//            System.out.println("解锁账号成功");
//        } catch (NamingException e) {
//            System.out.println("解锁账号失败");
//            e.printStackTrace();
//        }
//    }
//
//    //重置密码
//    public void updateUserPassword(String cn, String newPassword) throws
//            UnsupportedEncodingException, NamingException {
//
//        ModificationItem[] mods = new ModificationItem[1];
//
//        String newQuotedPassword = "\"" + newPassword + "\"";
//
//        byte[] newUnicodePassword = newQuotedPassword.getBytes("UTF-8");
//
//        mods[0] = new ModificationItem(DirContext.REPLACE_ATTRIBUTE,
//
//                new BasicAttribute("unicodePwd", newUnicodePassword));
//
//        // 修改密码
//        String userDN = getUserDN(cn);
//        ctx.modifyAttributes(userDN, mods);
//
//    }
//
//    /**
//     * AD账户时间戳转换
//     * @param accountExpiresL
//     * @return
//     */
//    public static Date adExpiresToDate(long accountExpiresL){
//        Calendar calendar = Calendar.getInstance();
//        calendar.clear();
//        calendar.set(1601, 0, 1, 0, 0);
//        accountExpiresL = accountExpiresL/ 10000 + calendar.getTime().getTime();
//        return new Date(accountExpiresL);
//    }
//
//    /**
//     * 获取AD账户失效日期
//     * @param account
//     * @return
//     */
//    public  Date getAccountExpiresToDate(String account){
//        Attributes attrs = getUser(account);
//        //distinguishedname这个属性即是用户的dn,可以打印看看
//        String accountexpires = attrs.get("accountexpires").toString().split(":")[1].trim();
////        return accountexpires;
//        System.out.println(accountexpires);
//        Long expiresLong = Long.parseLong(accountexpires);
//        Date expiresDate  = adExpiresToDate(expiresLong);
//        System.out.println(expiresDate);
//        return expiresDate;
//    }
//
//    /**
//     * 上次密码修改时间
//     * @param account
//     * @return
//     */
//    public Date getPwdLastSetTime(String account){
//        Attributes attrs = getUser(account);
//        //distinguishedname这个属性即是用户的dn,可以打印看看
//        String pwdlastset = attrs.get("pwdlastset").toString().split(":")[1].trim();
////        return accountexpires;
//        System.out.println(pwdlastset);
//        Long pwdlastsetLong = Long.parseLong(pwdlastset);
//        Date pwdLastSetDate  = adExpiresToDate(pwdlastsetLong);
//        System.out.println(pwdLastSetDate);
//        return pwdLastSetDate;
//    }
//
//
//}
